package com.skivingcloud.camunda.service;

import com.mybatisflex.core.paginate.Page;
import com.skivingcloud.admin.security.SecurityUser;
import com.skivingcloud.camunda.entity.ProcessDefinitionEntity;
import com.skivingcloud.camunda.entity.ProcessXmlVo;
import com.skivingcloud.common.utils.PageParameter;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.bpmn.instance.StartEvent;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 流程模型设计
 * @author hushouquan
 *
 */
public interface ModelService{
    
    /**
     * 分页查询模型
     * @param parameter 参数
     * @param user 用户
     * @return 模型列表
     */
    Page<ProcessDefinitionEntity> list(PageParameter<Map<String, Object>> parameter, SecurityUser user);
    
    /**
     * 根据id加载模型数据
     *
     * @param processDefinitionId 模型id
     * @return 模型内容
     */
    BpmnModelInstance getEditorJson(String processDefinitionId);
    
    /**
     * 获取最新版的流程定义
     * @return 流程定义
     */
    List<ProcessDefinition> getProcessOption();
    
    /**
     * 发布模型
     * @param id 模型id
     * @param user 用户
     */
    void deploy(String id, SecurityUser user);
    
    /**
     * 加载流程文件内容
     * @param processDefinitionId 流程定义id
     * @return 流程文件内容
     */
    InputStream resourceRead(String processDefinitionId);
    
    /**
     * 流程导入
     * @param files 文件
     * @param user 用户
     */
    void importDeploy(List<MultipartFile> files, SecurityUser user) throws Exception;
    
    /**
     * 获取开始节点信息用于组织页面表单
     * @param defKey 节点编码
     * @return 开始节点
     */
    StartEvent getModelStartNodeInfo(String defKey);
    
    /**
     * 根据id获取流程文件xml
     * @param id 流程定义id
     * @return 流程文件xml
     */
    String getResourceByDefId(String id) throws IOException;
    
    /**
     * 保存流程设计
     * @param xmlVo 流程设计内容
     * @param user 用户
     */
    void saveProcessDefinition(ProcessXmlVo xmlVo, SecurityUser user);
    
    /**
     * 查询模型历史记录列表
     * @param parameter 参数
     * @return 分页结果
     */
    Page<ProcessDefinitionEntity> getModelDeployHisList(PageParameter<Map<String, Object>> parameter);
    
    /**
     * 根据部署id获取流程定义
     * @param deploymentId 部署编号
     * @return 流程定义
     */
    ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId);
    
    /**
     * 删除一个模型
     * @param id 流程定义id
     */
    void deleteModel(String id);
    
    /**
     * 获取流程信息
     * @return {key:流程定义编码,value:流程名称}
     */
    List<Map<String, String>> getProcessDefKV();
}
